/** 字符串键 */
type TstringKey<T extends object> = Exclude<keyof T, symbol | number>;

/** 原始类型 */
type Tprimitive = undefined | null | string | boolean | number | symbol | bigint;

/** 值类型 */
type Tvalue = Exclude<Tprimitive, symbol | bigint>;

/** 常用值类型 */
type Tcommon_value = string | boolean | number;

/** 数组长度的联合类型 */
type TarrayIndexs<length extends number, _ extends number[] = []> = _['length'] extends length ? _[number] : TarrayIndexs<length, [..._, _['length']]>;

/** 类类型，实际上是构造方法类型。 */
type Tclass<T> = new (...args: Array<any>) => T;

/** 从 联合类型 U1 中 排除掉 数组 A */
type TExcludeValues<U1, A extends U1[]> = U1 extends A[number] ? never : U1;

/** 从 联合类型 U1 中 排除掉 联合类型 U2 */
type _TExcludeUnion_X_<T> = T extends any ? T[] : never;
type TExcludeUnion<U1, U2 extends U1> = TExcludeValues<U1, _TExcludeUnion_X_<(U2 extends any ? [U2] : never)[number]>>;

/** 枚举键 */
type TEnumKeys<T> = T extends { [key: string]: any } ? keyof T : never;

/** 函数类型 */
type Tfunction<T> = (...args: Array<any>) => T;
